package ru.javadevelop.homefinans.models;

/**
 * http://t-menu.ru
 * User: navff
 * Date: 18.07.12
 * Time: 6:06
 */

import android.content.Context;
import com.neurospeech.wsclient.WSHelper;
import com.neurospeech.wsclient.WSObject;
import org.w3c.dom.Element;
import ru.javadevelop.homefinans.common.DB;
import ru.javadevelop.homefinans.models.interfaces.IBaseRemoteDbEntity;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * Класс категорий затрат. Не является иерархичным.
 */
public class Category implements IBaseRemoteDbEntity {
    public  String  id;
    public  String name;
    public  String username;

    public final String DEFAULT_USERNAME = "var@33kita.ru";

    /**
     * Конструктор категории. Создаёт категорию и тут же сохраняет её в локальную БД.
     * @param id
     * @param name Название категории.
     */
    public Category(String id, String name, String username) {
        this.id = id;
        this.name = name;
        this.username = username;
    }

    public Category(String name) {
        this.id = UUID.randomUUID().toString();
        this.name = name;
        this.username = DEFAULT_USERNAME;
    }

    public Category() {
        // Do nothing
    }

    public void saveToRemoteDb()
    {
        //TODO Написать реалиацию сохранения сущности в удаленную БД
    }

    public void refreshFromRemoteDb() {
        //TODO Написать реалтзацию сохранения данных в удаленную БД
    }

    /**
     * Сохраняет категорию в локальную БД. Если категория существовала до этого, — обновляем в БД.
     * Если категория не существовала, — создаём новую в БД.
     * @return
     */
    public String save() {

            boolean exists = this.id != null && DB.INSTANCE.executeSql(new DB.Handler<Boolean>() {
                @Override
                public Boolean  execute(Statement stmt) throws SQLException {
                    ResultSet resultSet = stmt.getResultSet();
                    return resultSet.next();
                }
            }, "SELECT * FROM categories WHERE id=?", this.id);
            // Если запись существовала, — обновляем её  (проверяется по id)
            // у вновь создаваемых записей id=0

            if  (exists)
            {
                DB.INSTANCE.executeSql("UPDATE categories SET name = ? WHERE id = ?", this.name, this.id);
                return this.id;
            }
            else
            {
                // Если записи не существовало, — добавляем новую
                DB.INSTANCE.executeSql("INSERT INTO categories (id, name, username) VALUES(?,?,?)",
                                        this.id, this.name, this.username);
                return this.id;
            }
    }

    @Override
    public String toString()
    {
        return this.name;
    }

    /**
     * Выдает все категории из локальной БД
     * @return Список категорий
     */
    public static ArrayList<Category> getAll()
    {
        return DB.INSTANCE.executeSql(new DB.Handler<ArrayList<Category>>() {
            @Override
            public ArrayList<Category> execute(Statement stmt) throws SQLException {
                ArrayList<Category> result = new ArrayList<Category>();
                ResultSet resultSet = stmt.getResultSet();

                while(resultSet.next())
                {
                    Category cat = new Category(resultSet.getString(1), resultSet.getString(2), resultSet.getString(3));
                    result.add(cat);
                }
                return result;
            }
        }, "SELECT * FROM categories");
    }

    /**
     * Обновить
     */
    public static void refreshAllFromRemoteDb()
    {
        // TODO: обновить записи в локальной бд из удаленной БД
        return;
    }

    public static Category byId(Context context, String id)
    {
        return DB.INSTANCE.executeSql(new DB.Handler<Category>() {
            @Override
            public Category execute(Statement stmt) throws SQLException {
                ResultSet resultSet = stmt.getResultSet();
                resultSet.next();
                return new Category(resultSet.getString(1), resultSet.getString(2), resultSet.getString(3));
            }
        }, "SELECT * FROM categories WHERE id=?", id);
    }

    public static void geleteAllLocal(String username)
    {
        DB.INSTANCE.executeSql("DELETE FROM categories WHERE username=?", username);
    }

}
